<?php
/**
 * Created by PhpStorm.
 * User: lhl
 * Date: 2020/11/30
 * Time: 9:43
 * Features:学习数据 数据库基础模型
 */

namespace app\common\model\learn_data;


use app\common\model\depots\DepotsBaseModel;
use think\Db;

abstract class LearnDataBaseModel extends DepotsBaseModel
{
    //此表的子数据库的标识的固定前缀
    protected $databaseKeyPrefix = 'learn_data_database';

    //此表的子数据库的名称的固定前缀,动态创建数据库时使用
    protected $databaseNamePrefix = 'ahsmpv3_learn_data';

    /**
     * 创建学习数据表
     * @param int $hostId 主机id
     */
    public function createTable($hostId){
        //设置表名及库名
        $this->setHostId($hostId);
        $sql = <<<EOF
                CREATE TABLE IF NOT EXISTS `{$this->table}` (
                  `id` bigint(100) unsigned NOT NULL AUTO_INCREMENT,
                  `rawdata` tinyblob COMMENT '二进制信息',
                  `host_id` int(11) NOT NULL COMMENT '主机id',
                  `protocols` int(11) NOT NULL COMMENT '协议 6 tcp 17 udp',
                  `src_ip` varchar(15) NOT NULL COMMENT '源ip地址',
                  `src_mac` varchar(17) NOT NULL COMMENT '源mac地址',
                  `dest_ip` varchar(15) NOT NULL COMMENT '目标ip地址',
                  `dest_port` int(11) NOT NULL COMMENT '目标端口',
                  `dest_mac` varchar(17) NOT NULL COMMENT '目标mac',
                  `direction` tinyint(1) NOT NULL COMMENT '流量方向 1出战 2进站',
                  `view` bigint(20) NOT NULL DEFAULT '0' COMMENT '本次访问次数',
                  `last_view` bigint(20) NOT NULL DEFAULT '0' COMMENT '上一次访问次数',
                  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否生成规则 0没有生成 1生成',
                  `have_mac_addr` tinyint(1) NOT NULL DEFAULT '0' COMMENT '生成规则时是否添加mac 地址 0不添加 1添加',
                  `mark` varchar(50) NOT NULL COMMENT '特征码',
                  `ctime` int(11) NOT NULL COMMENT '添加时间',
                  `syslog` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否上传syslog',
                  `elk` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否上传elk',
                  `matched` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已经匹配处理',
                  `learn_number` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '学习次数',
                  PRIMARY KEY (`id`),
                  UNIQUE KEY `learn_data_one` (`host_id`,`src_ip`,`dest_ip`,`dest_port`,`protocols`,`direction`) USING BTREE
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
EOF;
        //这里必须使用模型,与默认数据库连接不一样
        $result = $this->execute($sql);
        if($result === false){
            return false;
        }else{
            return true;
        }
    }

    /**
     * 创建新数据库时,初始化创建其他业务数据表
     * @param array $thisConfig 本此新创建的数据库配置
    */
    protected function initCreateOtherTables($thisConfig){
        if(!$thisConfig){
            return false;
        }
        //创建学习数据图标表
        $response = $this->createLearnDataIconTable($thisConfig);
        if(!$response){
            return false;
        }
        return true;
    }

    /**
     * 创建新数据库时,创建学习数据图标表
     * @param array $thisConfig 本此新创建的数据库配置
    */
    protected function createLearnDataIconTable($thisConfig){
        $sql = <<<EOF
              CREATE TABLE IF NOT EXISTS `{$thisConfig['prefix']}host_learn_icon` (
                  `learn_id` bigint(100) NOT NULL DEFAULT '0' COMMENT '学习数据id',
                  `host_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '主机id',
                  `is_add` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否增加',
                  `is_modify` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否存在',
                  `is_delete` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否缺少'
              ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
EOF;
        //这里必须使用新建的数据库的配置,否则无法创建,因为配置文件无法热重载
        $result = Db::connect($thisConfig)->execute($sql);
        //关闭此数据库连接，后续作业务时进行重连
        Db::connect($thisConfig)->close();
        if($result === false){
            return false;
        }else{
            return true;
        }
    }
}